package com.itheima.controller;

import com.github.pagehelper.PageInfo;
import com.itheima.domain.Result;
import com.itheima.domain.User;
import com.itheima.exception.BusinessException;

import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.Errors;
import org.springframework.validation.FieldError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.List;

@RestController//等价于@Controller+@ResponseBody
@RequestMapping("/user")
public class UserController {
    //@Autowired
    @Reference//dubbo包中的@Reference注解
    private UserService userService;

    /*
    查询所有用户信息
     */
    @GetMapping //路径：http://localhost:8080/springmvc_03_case/user + get请求
    public Result findAll() {
        List<User> list = userService.findAll();
        return new Result(true,"查询用户成功",list);//
    }

    /**
     * 分页查询用户信息
     *
     * @param page     当前页
     * @param pageSize 每页条数
     * @return 分页数据
     */
    @GetMapping("{page}/{pageSize}") //路径：http://localhost:8080/springmvc_03_case/user/1/3 + get请求
    public Result findByPage(@PathVariable Integer page, @PathVariable Integer pageSize) {
        PageInfo<User> info = userService.findByPage(page, pageSize);
        return new Result(true,"查询用户成功",info);
    }

    /**
     * 根据id查询用户信息
     *
     * @param id 用户id
     * @return 用户信息
     */
    @GetMapping("{id}") //路径：http://localhost:8080/springmvc_03_case/user/2 + get请求
    public Result findById(@PathVariable Integer id) {
        User user = userService.findById(id);
        return new Result(true,"查询用户成功",user);
    }

    /**
     * 保存用户信息
     *
     * @param user 要保存用户对象
     * @return 影响的行数
     */
    @PostMapping //路径：http://localhost:8080/springmvc_03_case/user + post请求
    public Result save(@RequestBody @Validated User user, Errors errors) {
         //判断是否有异常
        if(errors.hasErrors()){
            //获取所有异常
            List<FieldError> fieldErrors = errors.getFieldErrors();
            //遍历异常,如果有就响应告诉客户
            for (FieldError fieldError : fieldErrors) {
                String message = fieldError.getDefaultMessage();//校验错误信息
                throw new BusinessException(message);
            }
        }
        //执行操作
        userService.save(user);
        return new Result(true,"保存成功");
    }

    /**
     * 修改用户信息
     *
     * @param user 要修改的用户对象
     * @return 影响的行数
     */
    @PutMapping //路径：http://localhost:8080/springmvc_03_case/user + put请求
    public Result update(@RequestBody @Validated  User user, Errors errors) {
        //判断是否有异常
        if(errors.hasErrors()){
            //获取所有异常
            List<FieldError> fieldErrors = errors.getFieldErrors();
            //遍历异常,如果有就响应告诉客户
            for (FieldError fieldError : fieldErrors) {
                String message = fieldError.getDefaultMessage();//校验错误信息
                throw new BusinessException(message);
            }
        }
        userService.update(user);
        return new Result(true,"修改成功");
    }

    /**
     * 根据id删除用户信息
     *
     * @param id 要删除的用户id
     * @return 影响的行数
     */
    @DeleteMapping("{id}")//路径：http://localhost:8080/springmvc_03_case/user/3 + delete请求
    public Result delete(@PathVariable Integer id) {
        userService.delete(id);
        return new Result(true,"删除成功");
    }

    /**
     * 用户登录
     *
     * @param username 用户名
     * @param password 密码
     * @return 查询到的用户对象
     *///路径：http://localhost:8080/springmvc_03_case/user/login/tom/123456 + get请求
    @GetMapping("/login/{username}/{password}")
    public Result login(@PathVariable String username, @PathVariable String password, HttpSession session) {

        User user = userService.login(username, password);
        if(user!=null){
            session.setAttribute("user",user);
        }

        return new Result(user!=null,user!=null?"登录成功":"登录失败");
    }
}
